(function () {
  const _checkRegExp = function (type, value) {

    // 如何判断用户是使用的New运算符，
    // 还是直接调用函数？
    console.log(this instanceof _checkRegExp); // true  , false
    if (this instanceof _checkRegExp) {
      //  this[type] === this.Email, this.Sid
      // Email,Sid都只能是通过原型链继承。
      console.log(this[type]); // 对应的函数
      // 判断type是否有对应的构造函数
      if (typeof this[type] !== 'function') {
        throw new Error('参数 type: ' + type + ', 参数传入不正确或不存在，请注意大小写，如:Email,Sid')
      }
      // 最终返回的是type对应的构造函数的实例化对象
      return new this[type](value)

    } else {
      // 如果是false，表示是直接调用的函数
      // 再重新实例化一个对象，并且返回这个实例化对象
      return new _checkRegExp(type, value)
    }
  }

  _checkRegExp.prototype = {
    // 把原型对象上面的方法，都设计为一个构造函数的形式
    // 使用是，要New 这些构造函数。
    Email: function (value) {
      let reg = /^\w+@\w+\.\w{1,3}$/
      if (reg.test(value)) {
        this.result = 1; //'通过'
      } else {
        this.result = 0; // '不通过'
      }
    },
    Sid: function (value) {
      let reg = /^\d{17}[0-9xX]$/
      if (reg.test(value)) {
        this.result = 1; //'通过'
      } else {
        this.result = 0; // '不通过'
      }
    },
    Tel: function (value) {

    },
    //....
  }

  window.CheckRegExp = _checkRegExp
})();

//vue,react种，用es6 export来公开
/* 
export  const _checkRegExp = function (type, value) {}
 _checkRegExp.prototype={}


 组件里面，导入：
 import {_checkRegExp} from './reg.js'
 created:{
  
 },
 methods:{
  login(){
    let a = new _checkRegExp('Email','asfas@aqq.com')
    if(a.result ==== 1){}else{}
  }

  checkAge(rule, value, callback){
    if (!value) {
       return callback(new Error('年龄不能为空'));
    }
    let a = new _checkRegExp('Age',23)
    if(a.result ==== 1){
      callback('验证通过')
    }else{
      callback('验证不通过')
    }
      
 }，

data(){
  return {
      rules: {   
              age: [
                { validator: checkAge, trigger: 'blur' }
              ]
            }
  }
}
*/